package campeonatofutebol.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

import javax.crypto.spec.OAEPParameterSpec;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import android.util.Log;

public class WebServiceInterface {
	static WebServiceInterface _w;
	private WebServiceInterface() {};
	
	public static WebServiceInterface getInstance() {
		return _w == null? (_w = new WebServiceInterface()) : _w;
	}
	public String getXmlFromUrl(String url) {
        String xml = null;
 
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
 
            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            xml = EntityUtils.toString(httpEntity);
 
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // return XML
        return xml;
    }
	
	public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {
		InputStream is = null;
		String json = null;
		JSONObject jObj = null;
	    // Making HTTP request
	    try {
	        // defaultHttpClient
	        DefaultHttpClient httpClient = new DefaultHttpClient();
	        HttpPost httpPost = new HttpPost(url);
	        httpPost.setEntity(new UrlEncodedFormEntity(params));

	        HttpResponse httpResponse = httpClient.execute(httpPost);
	        HttpEntity httpEntity = httpResponse.getEntity();
	        is = httpEntity.getContent();

	    } catch (UnsupportedEncodingException e) {
	        e.printStackTrace();
	    } catch (ClientProtocolException e) {
	        e.printStackTrace();
	    } catch (IOException e) {
	        e.printStackTrace();
	    }

	    try {
	        BufferedReader reader = new BufferedReader(new InputStreamReader(
	                is, "iso-8859-1"), 8);
	        StringBuilder sb = new StringBuilder();
	        String line = null;
	        while ((line = reader.readLine()) != null) {
	            sb.append(line + "\n");
	        }
	        is.close();
	        json = sb.toString();
	        Log.e("JSON", json);
	    } catch (Exception e) {
	        Log.e("Buffer Error", "Error converting result " + e.toString());
	    }

	    // try parse the string to a JSON object
	    try {
	        jObj = new JSONObject(json);            
	    } catch (JSONException e) {
	        Log.e("JSON Parser", "Error parsing data " + e.toString());
	    }

	    // return JSON String
	    return jObj;

	}
	
	public Document getDomElement(String xml){
        Document doc = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
 
            DocumentBuilder db = dbf.newDocumentBuilder();
 
            InputSource is = new InputSource();
                is.setCharacterStream(new StringReader(xml));
                doc = db.parse(is);
 
            } catch (ParserConfigurationException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            } catch (SAXException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            } catch (IOException e) {
                Log.e("Error: ", e.getMessage());
                return null;
            }
                // return DOM
            return doc;
    }
	
	public String getValue(Element item, String str) {
	    NodeList n = item.getElementsByTagName(str);
	    return this.getElementValue(n.item(0));
	}
	 
	public final String getElementValue( Node elem ) {
	         Node child;
	         if( elem != null){
	             if (elem.hasChildNodes()){
	                 for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
	                     if( child.getNodeType() == Node.TEXT_NODE  ){
	                         return child.getNodeValue();
	                     }
	                 }
	             }
	         }
	         return "";
	  }
	
	public List<String> loadMessages(String tituloJogo_) {
//		p.add(new BasicNameValuePair("mural", ""+id));
		List<String> l = new ArrayList<String>();
		List<NameValuePair> p = new ArrayList<NameValuePair>();
		String tituloJogo = tituloJogo_; //.substring(tituloJogo_.indexOf("\n")+1, tituloJogo_.length());
//		try {
//			tituloJogo = URLEncoder.encode(tituloJogo_, "UTF-8");
//		} catch (Exception e) {
//			Log.w("!!!", "encode " + e.getMessage());
//		}
		Log.w("!!!", "TITULO" + tituloJogo);
		String id = getIdMural(tituloJogo);
		Log.w("!!!", "id " + id);
		if(id == null) {
			String uid = getUserId("admin");
			if(uid == null) {
				Log.w("!!!", createUser("admin")? "create ok" : "create error");
				uid = getUserId("admin");
			}
			if(createWall(tituloJogo)) {
				id = getIdMural(tituloJogo);
				Log.w("!!!", postMessage(id, uid, "test")? "message ok" : "message error");
			}
		}
		JSONObject o = getJSONFromUrl(String.format("http://les.dsc.ufcg.edu.br/campeonatobr/get_msgs_wall_json.php?mural=%s", id), p);
		Log.w("!!!", o.toString());
		try {
			JSONArray a = o.getJSONArray("msgs");
			for(int i = 0; i < a.length(); i++) {
			//	if(getUserLogin(a.getJSONObject(i).getString("user_id"))!= "admin"){
					l.add(String.format("%s: %s",
						getUserLogin(a.getJSONObject(i).getString("user_id")),
						a.getJSONObject(i).getString("msg")
					));
				//}
			}
		} catch (Exception e) {
			Log.w("!!!", ""+e.getMessage());
		}
		return l;
	}
	
	public boolean postMessage(String muralId, String userId, String text) {
		List<NameValuePair> p = new ArrayList<NameValuePair>();
		boolean b = false;
		try {
			JSONObject o = getJSONFromUrl(String.format("http://les.dsc.ufcg.edu.br/campeonatobr/create_msg_json.php?mural=%s&user=%s&texto=%s", muralId, userId, URLEncoder.encode(text, "UTF-8")), p);
			b = o.getInt("sucesso") == 1;
			Log.w("!!!", o.getString("msg"));
		} catch (Exception e) {
			
		}
		return b;
	}
	
	public String getUserLogin(String userId) {
		List<NameValuePair> p = new ArrayList<NameValuePair>();
		JSONObject o = getJSONFromUrl("http://les.dsc.ufcg.edu.br/campeonatobr/get_user_json.php", p);
		String user = null;
		try {
			JSONArray a = o.getJSONArray("usuarios");
			for(int i = 0;; i++) {
				if(a.getJSONObject(i).getString("id").equals(userId)) {
					user = a.getJSONObject(i).getString("login");
				}
			}
		} catch (Exception e) {
			Log.w("!!!", ""+e.getMessage());
		}
		return user;
	}
	
	public String getUserId(String login) {
		List<NameValuePair> p = new ArrayList<NameValuePair>();
		JSONObject o = getJSONFromUrl("http://les.dsc.ufcg.edu.br/campeonatobr/get_user_json.php", p);
		String user = null;
		try {
			JSONArray a = o.getJSONArray("usuarios");
			for(int i = 0; i < a.length(); i++) {
				if(a.getJSONObject(i).getString("login").equals(login)) {
					user = a.getJSONObject(i).getString("id");
					break;
				}
			}
		} catch (Exception e) {
			Log.w("!!!", ""+e.getMessage());
		}
		return user;
	}
	
	public boolean createUser(String login) {
		List<NameValuePair> p = new ArrayList<NameValuePair>();
		boolean b = false;
		try {
			JSONObject o = getJSONFromUrl(String.format("http://les.dsc.ufcg.edu.br/campeonatobr/create_usr_json.php?login=%s", login), p);
			b = o.getInt("sucesso") == 1;
			Log.w("!!!", o.getString("msg"));
		} catch (Exception e) {
			
		}
		return b;
	}
	public boolean createWall(String titulo) {
		List<NameValuePair> p = new ArrayList<NameValuePair>();
		boolean b = false;
		try {
			JSONObject o = getJSONFromUrl(String.format("http://les.dsc.ufcg.edu.br/campeonatobr/create_wall_json.php?titulo=%s",URLEncoder.encode(titulo, "UTF-8")), p);
			b = o.getInt("sucesso") == 1;
			Log.w("!!!", o.getString("msg"));
		} catch (Exception e) {
			Log.w("!!!", ""+e.getMessage());
		}
		return b;
	}
	
	public String getIdMural(String tituloJogo_) {
		List<NameValuePair> p = new ArrayList<NameValuePair>();
		JSONObject o = getJSONFromUrl("http://les.dsc.ufcg.edu.br/campeonatobr/get_wall_json.php", p);
		String id = null;
		try {
			String tituloJogo = tituloJogo_; //URLEncoder.encode(tituloJogo_, "UTF-8");
			JSONArray a = o.getJSONArray("murais");
			for(int i = 0; i < a.length(); i++) {
				//String tituloJogoAtual = URLEncoder.encode(a.getJSONObject(i).getString("titulo"), "UTF-8");
				String tituloJogoAtual = a.getJSONObject(i).getString("titulo");
				if(tituloJogoAtual.equals(tituloJogo)) {
					id = a.getJSONObject(i).getString("id");
					break;
				}
			}
		} catch (Exception e) {
			Log.w("!!!", ""+e.getMessage());
		}
		return id;
	}


	public List<String> loadMessages2() {
		List<String> l = new ArrayList<String>();
		WebServiceInterface w = new WebServiceInterface();
		//w.getXmlFromUrl("http://les.dsc.ufcg.edu.br:8080/campeonatobr/indexchamadas.php");
		String r = "<mural>" +
				"<titulo> Joga Olinda X S�o Mendes </titulo>" +
				"<mensagem>" +
				"<usuario> Joao </usuario>" +
				"<texto> Gostei da lateral </texto>" +
			"</mensagem>" +
			"<mensagem>" +
			"<usuario> Marcelo </usuario>" +
			"<texto> Jogao </texto>" +
			"</mensagem>" +

			"<mensagem>" +
				"<usuario> Cintia </usuario>" +
				"<texto> Marcou legal </texto>" +
			"</mensagem>" +

			"<mensagem>" +
				"<usuario> Joao </usuario>" +
				"<texto> Timao </texto>" +
			"</mensagem>" +

				"<mensagem>" +
				"<usuario> Joao </usuario>" +
				"<texto> Gostei da lateral </texto>" +
			"</mensagem>" +
			"<mensagem>" +
			"<usuario> Marcelo </usuario>" +
			"<texto> Jogao </texto>" +
			"</mensagem>" +

			"<mensagem>" +
				"<usuario> Cintia </usuario>" +
				"<texto> Marcou legal </texto>" +
			"</mensagem>" +

			"<mensagem>" +
				"<usuario> Joao </usuario>" +
				"<texto> Timao </texto>" +
			"</mensagem>" +

				"<mensagem>" +
				"<usuario> Joao </usuario>" +
				"<texto> Gostei da lateral </texto>" +
			"</mensagem>" +
			"<mensagem>" +
			"<usuario> Marcelo </usuario>" +
			"<texto> Jogao </texto>" +
			"</mensagem>" +

			"<mensagem>" +
				"<usuario> Cintia </usuario>" +
				"<texto> Marcou legal </texto>" +
			"</mensagem>" +

			"<mensagem>" +
				"<usuario> Joao </usuario>" +
				"<texto> Timao </texto>" +
			"</mensagem>" +
								
				"</mural>";
		Document doc = w.getDomElement(r);
		NodeList nl = doc.getElementsByTagName("mensagem");
		for (int i = 0; i < nl.getLength(); i++) {
			Element el = (Element)nl.item(i);
		    String msg = w.getValue(el, "texto");
		    String author = w.getValue(el, "usuario");
		    l.add(author + ": " + msg);
		}
		return l;
	}
	
	
}
